package com.qst.repository;

import com.qst.pojo.entity.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.Optional;

/**
 * 用户数据访问层
 */
@Repository
public interface UserRepository extends JpaRepository<User, Integer> {

    /**
     * 根据用户名查找用户
     * @param username 用户名
     * @return 用户对象
     */
    Optional<User> findByUsername(String username);

    /**
     * 检查用户名是否存在
     * @param username 用户名
     * @return 是否存在
     */
    boolean existsByUsername(String username);

    /**
     * 根据邮箱查找用户
     * @param email 邮箱
     * @return 用户对象
     */
    Optional<User> findByEmail(String email);

    /**
     * 根据手机号查找用户
     * @param phone 手机号
     * @return 用户对象
     */
    Optional<User> findByPhone(String phone);

    /**
     * 根据角色查询用户
     * @param role 角色
     * @param pageable 分页参数
     * @return 用户分页数据
     */
    Page<User> findByRole(User.UserRole role, Pageable pageable);

    /**
     * 根据条件分页查询用户
     * @param username 用户名（模糊查询）
     * @param role 角色
     * @param pageable 分页参数
     * @return 用户分页数据
     */
    @Query("SELECT u FROM User u WHERE " +
           "(:username IS NULL OR u.username LIKE %:username%) AND " +
           "(:role IS NULL OR u.role = :role)")
    Page<User> findByConditions(@Param("username") String username,
                                 @Param("role") User.UserRole role,
                                 Pageable pageable);
}


